package com.zenithmind.note.service;

import com.zenithmind.note.pojo.entity.NoteFavorite;
import com.zenithmind.note.pojo.query.NoteFavoriteQuery;
import com.zenithmind.note.pojo.query.UserFavoriteQuery;
import com.zenithmind.note.pojo.vo.NoteVO;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.common.result.Result;

import java.util.List;

/**
 * 笔记收藏服务接口
 */
public interface NoteFavoriteService {
    
    /**
     * 收藏笔记 - 内部获取当前用户ID
     *
     * @param noteId 笔记ID
     * @return 收藏是否成功
     */
    Result<Boolean> favoriteNote(String noteId);
    
    /**
     * 收藏笔记 - 外部传入用户ID
     *
     * @param noteId 笔记ID
     * @param userId 用户ID
     * @return 收藏是否成功
     */
    Result<Boolean> favoriteNote(String noteId, String userId);
    
    /**
     * 取消收藏笔记 - 内部获取当前用户ID
     *
     * @param noteId 笔记ID
     * @return 取消收藏是否成功
     */
    Result<Boolean> unfavoriteNote(String noteId);
    
    /**
     * 取消收藏笔记 - 外部传入用户ID
     *
     * @param noteId 笔记ID
     * @param userId 用户ID
     * @return 取消收藏是否成功
     */
    Result<Boolean> unfavoriteNote(String noteId, String userId);
    
    /**
     * 查询用户收藏的笔记列表 - 内部获取当前用户ID
     *
     * @param current 当前页
     * @param size 每页大小
     * @return 用户收藏的笔记列表
     */
    PageResult<NoteVO> getUserFavorites(long current, long size);
    
    /**
     * 查询用户收藏的笔记列表 - 外部传入用户ID
     *
     * @param userId 用户ID
     * @param current 当前页
     * @param size 每页大小
     * @return 用户收藏的笔记列表
     */
    PageResult<NoteVO> getUserFavorites(String userId, long current, long size);
    
    /**
     * 判断用户是否收藏了笔记 - 内部获取当前用户ID
     *
     * @param noteId 笔记ID
     * @return 是否收藏
     */
    Result<Boolean> isFavorited(String noteId);
    
    /**
     * 判断用户是否收藏了笔记 - 外部传入用户ID
     *
     * @param noteId 笔记ID
     * @param userId 用户ID
     * @return 是否收藏
     */
    Result<Boolean> isFavorited(String noteId, String userId);
    
    /**
     * 后台管理-分页查询收藏记录
     *
     * @param query 查询对象
     * @return 分页结果
     */
    PageResult<NoteFavorite> favoriteManagePage(NoteFavoriteQuery query);
    
    /**
     * 后台管理-获取收藏详情
     *
     * @param favoriteId 收藏ID
     * @return 收藏详情
     */
    NoteFavorite getFavoriteById(String favoriteId);
    
    /**
     * 后台管理-添加或修改收藏记录
     *
     * @param favorite 收藏实体
     * @return 收藏实体
     */
    NoteFavorite addOrUpdateFavorite(NoteFavorite favorite);
    
    /**
     * 后台管理-批量删除收藏记录
     *
     * @param ids 收藏ID列表
     */
    void deleteBatch(List<String> ids);
    
    /**
     * 查询用户收藏的笔记列表 - 使用查询对象
     *
     * @param query 查询对象
     * @return 分页结果
     */
    PageResult<NoteVO> getUserFavoritePage(UserFavoriteQuery query);
} 